package com.example.javaxiangmu.controller;

import com.example.javaxiangmu.common.ApiResponse;
import com.example.javaxiangmu.dto.UserDTO;
import com.example.javaxiangmu.entity.User;
import com.example.javaxiangmu.service.UserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户控制器类
 * 
 * 提供用户管理的RESTful API接口
 * 处理HTTP请求，调用Service层完成业务逻辑
 * 
 * @author Your Name
 * @version 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    /**
     * 创建新用户
     * 
     * @param userDTO 用户数据传输对象
     * @return 统一响应格式，包含创建的用户信息
     */
    @PostMapping
    public ApiResponse<User> createUser(@Valid @RequestBody UserDTO userDTO) {
        log.info("收到创建用户请求，用户名: {}", userDTO.getUsername());
        User user = new User();
        user.setUsername(userDTO.getUsername());
        user.setEmail(userDTO.getEmail());
        user.setPassword(userDTO.getPassword());
        User createdUser = userService.createUser(user);
        log.info("创建用户请求处理完成，用户ID: {}", createdUser.getId());
        return ApiResponse.success("用户创建成功", createdUser);
    }

    /**
     * 根据ID查询用户
     * 
     * @param id 用户ID
     * @return 统一响应格式，包含用户信息
     */
    @GetMapping("/{id}")
    public ApiResponse<User> getUserById(@PathVariable Long id) {
        log.debug("收到查询用户请求，用户ID: {}", id);
        User user = userService.getUserById(id);
        return ApiResponse.success(user);
    }

    /**
     * 根据用户名查询用户
     * 
     * @param username 用户名
     * @return 统一响应格式，包含用户信息
     */
    @GetMapping("/username/{username}")
    public ApiResponse<User> getUserByUsername(@PathVariable String username) {
        log.debug("收到查询用户请求，用户名: {}", username);
        User user = userService.getUserByUsername(username);
        return ApiResponse.success(user);
    }

    /**
     * 查询所有用户
     * 
     * @return 统一响应格式，包含所有用户的列表
     */
    @GetMapping
    public ApiResponse<List<User>> getAllUsers() {
        log.debug("收到查询所有用户请求");
        List<User> users = userService.getAllUsers();
        return ApiResponse.success(users);
    }

    /**
     * 更新用户信息
     * 
     * @param id 用户ID
     * @param userDTO 包含更新信息的用户数据传输对象
     * @return 统一响应格式，包含更新后的用户信息
     */
    @PutMapping("/{id}")
    public ApiResponse<User> updateUser(@PathVariable Long id, @Valid @RequestBody UserDTO userDTO) {
        log.info("收到更新用户请求，用户ID: {}, 用户名: {}", id, userDTO.getUsername());
        User user = new User();
        user.setUsername(userDTO.getUsername());
        user.setEmail(userDTO.getEmail());
        user.setPassword(userDTO.getPassword());
        User updatedUser = userService.updateUser(id, user);
        log.info("更新用户请求处理完成，用户ID: {}", id);
        return ApiResponse.success("用户更新成功", updatedUser);
    }

    /**
     * 删除用户
     * 
     * @param id 用户ID
     * @return 统一响应格式
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> deleteUser(@PathVariable Long id) {
        log.info("收到删除用户请求，用户ID: {}", id);
        userService.deleteUser(id);
        log.info("删除用户请求处理完成，用户ID: {}", id);
        return ApiResponse.success("用户删除成功", null);
    }
}

